/*
 * Licensed under the MIT license:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */

(function () {
    Raphael.fn.toJSON = function (callback) {
        var data, elements = new Array, paper = this ;

        for (var el = paper.bottom; el != null; el = el.next) {
            data = callback ? callback(el, new Object) : new Object;

            if (data) elements.push({
                data: data,
                type: el.type,
                attrs: el.attrs,
//				transform: el.matrix.toTransformString(),
                transform: el.transform().toString(),
                id: el.id
            });
        }

        var cache = [];
        var o = JSON.stringify(elements, function (key, value) {
            //http://stackoverflow.com/a/11616993/400048
            if (typeof value === 'object' && value !== null) {
                if (cache.indexOf(value) !== -1) {
                    // Circular reference found, discard key
                    return;
                }
                // Store value in our collection
                cache.push(value);
            }
            return value;
        });
        cache = null;
        return o;
    }

    Raphael.fn.fromJSON = function (json, callback) {
        var el, paper = this ;

        if (typeof json === 'string') json = JSON.parse(json);

        for (var i in json) {
            if (json.hasOwnProperty(i)) {

                el = paper[json[i].type]().attr(json[i].attrs);
                if (json[i].transform != null) {
                    el.transform(json[i].transform);
                }

				el.id = json[i].id;

                if (callback) el = callback(el, json[i].data);

//				if ( el ) paper.set().push(el);
            }
        }
    }
})();
